// 引入封装的 Cookie
import { getToken, setToken, removeToken } from '@/utils/auth'
// 引入获取用户信息的请求
// 注意：获取用户信息 和 获取 员工基本信息 两个请求的结果要合并在一起存储起来，虽然是两个请求，本质是一个人的信息
import { getUserInfoRequest, getStaffBaseInfoRequest } from '@/api/user'
// 导出重置路由
import { resetRouter } from '@/router'

export default {
  namespaced: true,
  state: {
    token: getToken() || '',
    // 用户信息
    userInfo: {}
  },

  mutations: {
    // 传过来更新 token，并让 Cookie 也更新
    storageToken(state, payload) {
      state.token = payload
      setToken(payload)
    },

    // 清除vuex的 token 和 cookie 的 token，把用户信息删除
    clearToken(state) {
      state.token = ''
      removeToken()
    },

    // 清除 vuex 中的用户信息
    clearUserInfo(state) {
      state.userInfo = {}
    },

    // 存储个人信息进 state
    storageUserInfo(state, payload) {
      state.userInfo = payload
    }
  },

  actions: {
    // 发起请求，获取个人信息（在前置守卫里面调用的这个方法，要做到点击登录时，还没进入页面，即将进入页面的时候就获取用户信息）
    async getUserInfo(ctx) {
      // 注意：获取用户信息 和 获取员工基本信息 两个请求的结果要合并在一起存储起来，虽然是两个请求，本质是一个人的信息
      // 获取用户信息
      const userResult = await getUserInfoRequest()
        // 获取员工基本信息
      const staffResult = await getStaffBaseInfoRequest(userResult.data.userId)
        // 合并两个请求的数据，并存储到 state 中
      const userObj = Object.assign(userResult.data, staffResult.data)
      ctx.commit('storageUserInfo', userObj)
      return userObj
    },

    // 清除 vuex 和 cookie 的 token，并把用户信息删掉，实现登出
    // 注意：该项目这里不太完美，正规情况下，是要提交到后端清除后端那边和前端这边的token过期，而不只是清除前端
    logout(ctx) {
      ctx.commit('clearToken')
      ctx.commit('clearUserInfo')
        // 重置路由：
      resetRouter()
        // 4. 重置 vuex 中的路由信息（固定语法）
      ctx.commit('permission/setAsyncRoutes', [], { root: true })
    }
  },

  getters: {}
}
